package java8;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Stream;

public class LamdaStudy {
    public static void main(String[] args) {
        // ::关键字表示将某个类的方法（构造方法）看作接口的实现
        // accept接受一个参数无返回值,andThen表示在前一个Consumer的任务完成后接着做andThen里的Consumer任务
        Consumer c = (o) -> System.out.println(o);
        Consumer c1 = (o) -> System.out.println(o + "-c1");
        c.andThen(c1).accept("sss-是");

        // apple接受一个参数有返回值，andThen同上，compose表示先做compose任务，然后返回值作为参数给前一个Function，
        // identity静态方法，表示对参数不处理。compose优先级高于andThen,多个compose先执行后面的compose
        Function<Integer, Integer> f1 = (i) -> ++i;
        Function<Integer, Integer> f2 = (i) -> i * 3;
        System.out.println(f1.compose(f1).compose(f2).apply(1));
        // Predicate用于做逻辑判断，test方法返回一个boolean值。negate做取反处理(只取反negate方法前的值)，and和or方法表示且和或
        Predicate<String> p1 = (s) -> s.equals("test");
        Predicate<String> p2 = (s) -> s.startsWith("ta");
        System.out.println("Predicate测试"+p1.and(p2).negate().test("test"));

        // Stream 可用generate生成，map可映射结果，filter过滤，limit 方法用于获取指定数量的流
        // sorted方法排序等方法
        Stream.generate(() -> (int) (Math.random() * 10)).limit(10).sorted().map((s) -> s * 2).forEach(System.out::println);
        List<String> list = new ArrayList<String>();

        // Optional 使用of方法（不可为空）和ofNullAble（参数可空）根据参数创建对象；使用场景：判断数据不为空后的操作等
        Optional<String> optional = Optional.ofNullable("test");
        optional.ifPresent(System.out::println);
        System.out.println(optional.filter((o)-> "test".equals(o)).get());
        System.out.println(null!=null);
    }
}
